package com.example.utils;

import org.springframework.cglib.beans.BeanCopier;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Jason - Chusifeng
 * @version 1.0.0
 * @className BeanCopyUtil.java
 * @packageName com.example.utils
 * @createTime 2022年10月10日 15:18:57
 * @description
 */
@SuppressWarnings({"unchecked"})
public class BeanCopyUtil {
    /**
     * 因生成BeanCopier 类比较耗时，使用频繁的情况下缓存提高性能
     */
    private static final ConcurrentHashMap<String,BeanCopier> BEAN_COPIER_CONCURRENT_HASH_MAP = new ConcurrentHashMap<>(10);

    public static void copeBean(Object source, Object target) {
        String key  = target.getClass().getCanonicalName();
        BeanCopier copier = BEAN_COPIER_CONCURRENT_HASH_MAP.get(key);
        if (null == copier) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            BEAN_COPIER_CONCURRENT_HASH_MAP.put(key,copier);
        }
        copier.copy(source,target,null);
    }

    /**
     * map value cope bean ，不处理bean属性为数组/map等复杂结构的
     * @param source
     * @param target
     */
    public static void copeMapToBean(Map source, Object target) {
        Field[] fields = target.getClass().getDeclaredFields();
        source.forEach( (k,v) ->{
            for (Field field : fields) {
                if (field.getName().equals(k)) {
                    field.setAccessible(true);
                    try {
                        field.set(target,v);
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });

    }
}
